Various methods have been utilized for managing compatibility of data and applications, typically utilizing single version numbers that are attached to individual elements. Conventional methods, however, have multiple disadvantages.
For instance, in the context of serialization in the Java programming language, each class may be given a version, whereby the version is written when a class instance is serialized. Thereafter, before an instance is read, the associated version is read, and when the versions do not match, the application cannot read the instance. In this method, as the version information is not stored independently from the serialized data, the application cannot determine whether a serialized object may be read unless the application attempts to serialize the object and fails. Additionally, in a graph of objects each object is associated with its own version information; therefore, when an upstream node cannot be read, no information is available regarding an ability to read downstream nodes. Furthermore, as groups of related classes frequently upgrade simultaneously to the same version, serialized instances of those groups will often contain redundant version information.
Another conventional method for managing compatibility includes using a single-store version, whereby data are stored along with a number indicating a format of the data. Prior to reading any of the stored data, an application compares the format number against a format number associated with the application. The data are allowed to be read only when the numbers match. In the single-store version method, however, when a wide variety of instances are stored a single version number must be changed when any of the classes change. This renders the number effectively useless unless the store is specialized for a particular application. Furthermore, a single version number does not convey adequate information regarding which classes have changed.
Accordingly, a need exists for methods for efficiently determining and managing version information associated with sets of data objects, persistently storing the version information, and utilizing the stored version information to determine compatibility between the sets of data objects and applications, while avoiding the above-mentioned disadvantages.